﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModeloGaleriaNET;
using System.Data.Objects;
using MySql.Data.MySqlClient;

namespace CADs
{
    public class SubastaCAD: BaseCAD
    {
        private int queryCount;
        private List<SubastaFilter> filtros;

        public SubastaCAD()
            : base()
        {
            filtros = new List<SubastaFilter>();
        }

        public List<Subasta> GetAllSubasta()
        {
            return contexto.Subastas.ToList();
        }

        public Subasta GetSubastaById(int id)
        {
            List<Subasta> aux = contexto.Subastas.Where(s => s.Id == id).ToList();
            return (aux.Count == 0) ? null : aux.First();
        }

        public void SetQueryFilters(List<SubastaFilter> filters)
        {
            if (filters == null || filters.Count == 0)
                this.filtros.Clear();
            else
                this.filtros = filters;
        }

        public List<Subasta> GetSubastasPaginated(int pagenum = 0)
        {
            int pagesize = int.Parse(Properties.Resources.PageSize);

            ObjectQuery<Subasta> query = contexto.Subastas;
            
            query.MergeOption = MergeOption.OverwriteChanges;
            
            foreach (var filtro in filtros)
                query = query.Where(filtro.Condition, filtro.Parameters.ToArray());
            queryCount = query.Count();

            return query.Skip("it.Id", "@Skip", new ObjectParameter("Skip", pagenum * pagesize))
                        .Top("@Limit", new ObjectParameter("Limit", pagesize))
                        .ToList();
        }

        public int GetSubastasCount()
        {
            return queryCount;
        }

        public bool GuardarNuevaSubastaPropia(Subasta s)
        {
           try
            {
                contexto.AddToSubastas(s);
                SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool SavePuja(Subasta s, Puja p)
        {
            try
            {
                s.Pujas.Add(p);
                SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool SetIdExterno(Subasta s, int id)
        {
            try
            {
                s.ReferenciaExterna = id.ToString();
                SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public int getNumPujas(int id)
        {
            IEnumerable<Subasta> subastas = contexto.Subastas.Where(s => s.Id == id);

            if (subastas != null && subastas.Count() > 0)
                return subastas.First().Pujas.Count;
            else
                return Int32.MaxValue;

        }

        public Subasta GetSubastaByRefExterna(string refer)
        {
            IEnumerable<Subasta> subastas = contexto.Subastas.Where(s => s.ReferenciaExterna.Equals(refer));
            if (subastas != null && subastas.Count() > 0)
                return subastas.First();
            return null;
        }

        public void addSubastaDeOtro(SubastaDeOtro s)
        {
            SaveChanges();
        }

        public List<Subasta> GetSubastasCreadas()
        {
            SubastaFilter filtro;
            List<Subasta> subastas;

            filtro = new SubastaFilter(@"EXISTS (select shs.estado from subastashaveestadossubasta as " +
                        @"shs where it.id = shs.subasta and shs.fechafin is null and shs.estado = @inputEstado)", null);
            filtro.Parameters.Add(new ObjectParameter("inputEstado", new EstadoSubastaCAD().GetEstadoCreada().Id));
            subastas = contexto.Subastas.Where(filtro.Condition, filtro.Parameters.ToArray()).ToList();
            if (subastas != null && subastas.Count > 0)
                return subastas;
            return null;
        }
    }
}
